﻿using System;
using System.Diagnostics;
using System.Text.RegularExpressions;
using Microsoft.SmallBasic.Library;

namespace ExProgram4SmallBasic
{
    [SmallBasicType]
    public static partial class Program
    {
        #region 指定された外部プログラムを実行します。
#if LANG_JA
        /// <summary>
        /// 指定された外部プログラムを実行します。
        /// </summary>
        /// <param name="command">実行する外部プログラムとその引数です。
        /// たとえば "notepad.exe c:\temp\text.txt" のような形式です。
        /// </param>
#else
        /// <summary>
        /// Runs the specified command.
        /// </summary>
        /// <param name="command">The command.
        /// An example of command is "notepad.exe c:\temp\text.txt".
        /// </param>
#endif
        #endregion
        public static void Run(Primitive command)
        {
            RunCore(command);
        }

        #region 指定された外部プログラムを実行し、終了するまで待機します。
#if LANG_JA
        /// <summary>
        /// 指定された外部プログラムを実行し、終了するまで待機します。
        /// </summary>
        /// <param name="command">実行する外部プログラムとその引数です。
        /// たとえば "notepad.exe c:\temp\text.txt" のような形式です。
        /// </param>
        /// <returns>
        /// 実行した外部プログラムの終了コード。外部プログラムの実行に失敗した場合は、空の文字列が返ります。
        /// </returns>
#else
        /// <summary>
        /// Runs the the specified command, and wait for exit.
        /// </summary>
        /// <param name="command">The command.
        /// An example of command is "notepad.exe c:\temp\text.txt".
        /// </param>
        /// <returns>An exit code of command. if running command is failed, return value is empty string.</returns>
#endif
        #endregion
        public static Primitive RunAndWait(Primitive command)
        {
            var process = RunCore(command);
            if (process == null) return "";
            
            process.WaitForExit();
            return process.ExitCode;
        }

        private static Process RunCore(string command)
        {
            var parsed = Regex.Match(command, @"^((?<cmd>[^ ""]+)|(""(?<cmd>[^""]+)""))(?<args>.*)$");
            if (parsed.Success == false) return null;

            return Process.Start(parsed.Groups["cmd"].Value, parsed.Groups["args"].Value);
        }
    }
}
